home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1994 November / macformat-018.iso / Utility Spectacular / Developer / macgambit-20-compiler-src-p1 / Runtime (.c & .h) / main.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-07-26  |  5.0 KB  |  220 lines  |  [TEXT/KAHL]

  1. /* GAMBIT Scheme program loader for M680x0 machines */
  2.  
  3. #include "params.h"
  4. #include "gambit.h"
  5. #include "struct.h"
  6. #include "os.h"
  7. #include "mem.h"
  8. #include "strings.h"
  9. #include "load.h"
  10. #include "run.h"
  11. #include "link.h"
  12.  
  13.  
  14. /*---------------------------------------------------------------------------*/
  15.  
  16. /* Global data structures */
  17.  
  18. SSTATE_PTR sstate;  /* pointer to system state           */
  19. PSTATE_PTR pstate;  /* pointer to this processor's state */
  20.  
  21.  
  22. /*---------------------------------------------------------------------------*/
  23.  
  24.  
  25. long gambit_argc;
  26. char **gambit_argv, **gambit_envp;
  27.  
  28. long nb_args;
  29.  
  30. long nb_processors;
  31. long stack_len, heap_len, const_len;
  32. long remote, remote_stack, remote_heap, remote_intr;
  33.  
  34.  
  35. void usage_err()
  36. { os_warn( "Usage: %s [arg]...\n", (long)gambit_argv[0] );
  37.   os_warn( "           [--\n", 0L );
  38.   os_warn( "            [-sSTACK_SIZE_IN_KILOBYTES]\n", 0L );
  39.   os_warn( "            [-hHEAP_SIZE_IN_KILOBYTES]\n", 0L );
  40.   os_warn( "            [-cCONST_SIZE_IN_KILOBYTES]\n", 0L );
  41.   os_warn( "            [-d[DEBUG_LEVEL]]\n", 0L );
  42.   os_warn( "            [-vGLOBAL_VARIABLE]...\n", 0L );
  43.   os_warn( "            [-r[s][h][i]]\n", 0L );
  44.   os_warn( "            [-p]\n", 0L );
  45.   os_warn( "           ]\n", 0L );
  46.   os_quit();
  47. }
  48.  
  49.  
  50. void main_gambit1();
  51. void main_gambit2();
  52. void main_gambit3();
  53.  
  54.  
  55. void main_gambit( argc, argv, envp )
  56. int argc;
  57. char *argv[], *envp[];
  58. { gambit_argc = argc;
  59.   gambit_argv = argv;
  60.   gambit_envp = envp;
  61.   main_gambit1();
  62. }
  63.  
  64.  
  65. void main_gambit1()
  66. { long i;
  67.  
  68.   remote = 0;
  69.   remote_stack = 0;
  70.   remote_heap = 0;
  71.   remote_intr = 0;
  72.  
  73.   /* compute number of arguments to the program */
  74.  
  75.   nb_args = gambit_argc;
  76.   for(i=1; i<gambit_argc; i++)
  77.   { char *arg = gambit_argv[i];
  78.     if ((arg[0] == '-') && (arg[1] == '-') && (arg[2] == '\0'))
  79.     { nb_args = i; break; }
  80.   }
  81.  
  82.  
  83.   /* get size of stack, heap and constant area */
  84.  
  85.   if (link_stack_length_in_k < 0)
  86.     stack_len = ((long)DEFAULT_STACK_LENGTH_IN_K)*K;
  87.   else
  88.     stack_len = link_stack_length_in_k*K;
  89.  
  90.   if (link_heap_length_in_k < 0)
  91.     heap_len = ((long)DEFAULT_HEAP_LENGTH_IN_K)*K;
  92.   else
  93.     heap_len = link_heap_length_in_k*K;
  94.  
  95.   if (link_const_length_in_k < 0)
  96.   { const_len = 0;
  97.     for (i=0; i<link_nb_ofiles; i++) const_len += *(link_sizeof_ofiles[i]);
  98.     const_len += ((long)ADDITIONAL_CONST_LENGTH_IN_K)*K;
  99.   }
  100.   else
  101.     const_len = link_const_length_in_k*K;
  102.  
  103.   for(i=nb_args+1; i<gambit_argc; i++)
  104.   { char *arg = gambit_argv[i];
  105.     if (*arg == '-')
  106.       switch (arg[1])
  107.       { case 's': stack_len = string_to_int( &arg[2] )*K; break;
  108.         case 'h': heap_len  = string_to_int( &arg[2] )*K; break;
  109.         case 'c': const_len = string_to_int( &arg[2] )*K; break;
  110.         case 'r': remote = 1;
  111.                   arg += 2;
  112.                   while (*arg != '\0')
  113.                   switch (*arg++)
  114.                   { case 's' : remote_stack = 1; break;
  115.                     case 'h' : remote_heap  = 1; break;
  116.                     case 'i' : remote_intr  = 1; break;
  117.                     default  : usage_err();
  118.                   }
  119.       }
  120.   }
  121.  
  122.   if (stack_len < ((long)MIN_STACK_LENGTH_IN_K)*K)
  123.   { stack_len = ((long)MIN_STACK_LENGTH_IN_K)*K;
  124.     os_warn( "Minimum size stack (%dK) is being allocated\n",
  125.              (long)MIN_STACK_LENGTH_IN_K );
  126.   }
  127.  
  128.   if (heap_len < ((long)MIN_HEAP_LENGTH_IN_K)*K)
  129.   { heap_len = ((long)MIN_HEAP_LENGTH_IN_K)*K;
  130.     os_warn( "Minimum size heap (%dK) is being allocated\n",
  131.              (long)MIN_HEAP_LENGTH_IN_K );
  132.   }
  133.  
  134.  
  135.   /* setup global system memory */
  136.  
  137.   init_system_mem( main_gambit2 );
  138. }
  139.  
  140.  
  141. void main_gambit2( n )
  142. long n;
  143. { long i;
  144.  
  145.   nb_processors = n;
  146.  
  147.   /* handle arguments */
  148.  
  149.   sstate->program_filename = gambit_argv[0];
  150.   sstate->profiling = 0;
  151.   sstate->debug = 0;
  152.  
  153.   for(i=nb_args+1; i<gambit_argc; i++)
  154.   { char *arg = gambit_argv[i];
  155.     if (*arg == '-')
  156.     { if ((arg[1] == 's') || (arg[1] == 'h') || (arg[1] == 'c') || (arg[1] == 'r'))
  157.         ;
  158.       else if (arg[1] == 'd')
  159.         if (arg[2] != '\0')
  160.           sstate->debug = string_to_int( &arg[2] );
  161.         else
  162.           sstate->debug = 1;
  163.       else if (arg[1] == 'v')
  164.         ; /* will be handled later */
  165.       else if (arg[1] == 'p')
  166.         sstate->profiling = 1;
  167.       else
  168.         usage_err();
  169.     }
  170.     else
  171.       usage_err();
  172.   }
  173.  
  174.  
  175.   /* setup each processor's memory */
  176.  
  177.   init_processor_mem( main_gambit3 );
  178. }
  179.  
  180.  
  181. void main_gambit3()
  182. { long i;
  183.   void (*kernel)();
  184.  
  185.   /* setup table of object files to load */
  186.  
  187.   init_runtime();
  188.  
  189.   for (i=0; i<link_nb_ofiles; i++)
  190.   { long size = *(link_sizeof_ofiles[i]);
  191.     if (size < 0)
  192.       ((void (*)())link_ofiles[i])();
  193.     else
  194.       init_ofile( (char *)(link_ofiles[i]), size );
  195.   }
  196.  
  197.  
  198.   /* load the program */
  199.  
  200.   kernel = (void (*)())init_program( nb_args, gambit_argv, gambit_envp );
  201.  
  202.  
  203.   /* print value of global variables */
  204.  
  205.   for(i=nb_args+1; i<gambit_argc; i++)
  206.   { char *arg = gambit_argv[i];
  207.     if ((*arg == '-') && (arg[1] == 'v')) print_global_var( &arg[2] );
  208.   }
  209.  
  210.  
  211.   /* start executing the program */
  212.  
  213.   start_program( kernel );
  214.  
  215.   os_quit();
  216. }
  217.  
  218.  
  219. /*---------------------------------------------------------------------------*/
  220.